MI Representative Staff Disbursements

Comparison of all 14 MI House Representative disbursements to representative staffers from FEC funds.

Nature of the Review

Rep. Huizenga's campaign committee, Huizenga for Congress ("Campaign Committee"), may have accepted contributions from individuals employed in Rep. Huizenga's congressional office. If Rep. Huizenga failed to ensure that his campaign committee complied with applicable rules, regarding contributions from congressional employees, then he may have violated House rules, standards of conduct, and federal law.
The Campaign Committee reported campaign disbursements that may not be legitimate and verifiable campaign expenditures attributable to bona fide campaign or political purposes. If Rep. Huizenga converted campaign funds from the Campaign Committee to personal use, or if Rep. Huizenga's Campaign Committee expended funds that were not attributable to bona fide campaign or political purposes, then Rep. Huizenga may have violated House rules, standards of conduct, and fedteral law.

OCE Recommendation

The Board recommended that the Committee further review the above allegation concerning Rep. Huizenga because there is substantial reason to believe that Rep. Huizenga's Campaign Committee accepted contributions from individuals employed in Rep. Huizenga's congressional office.
The Board recommended that the Committee further review the above allegation concerning Rep. Huizenga because tehre[sic] is substantial rea son to believe that Rep. Huizenga's Campaign Committee reported campaign disbursements that were not legitimate and verifiable campaign expenditures attributable to bona fide campaign or political purposes.

Source: OCE Referral Regarding Rep. Bill Huizenga, Nov 14, 2019

Source Data:

  1. FEC Disbursement Database
  2. Staff Listings:

Corrections / Issues.

Please open a ticket for any issues, errors, or omissions

Data Analysis Setup.

In [1]:
%matplotlib inline
from __init import *
from lookup import Congressman

Generate pretty plots for printing.

In [2]:
# https://stackoverflow.com/questions/332289/how-do-you-change-the-size-of-figures-drawn-with-matplotlib#comment87590438_41717533
sns.set(
    rc={
        "axes.labelsize": 12,
        "axes.titlesize": 18,
        "figure.figsize": (11, 8.5),
        "figure.dpi": 300,
        "figure.facecolor": "w",
        "figure.edgecolor": "k",
    }
)

Read all of the Michigan disbursement data & reps data.

In [3]:
df = pd.read_csv(
    filepath_or_buffer="mi_rep_all_disbursement_data.csv.gz",
    compression="gzip",
    header=0,
)
# Load all representative data. 
reps = lookup.savepoint()
# Get MI Reps.
mi = [rep for rep in reps if rep.state_abbr == "MI"]
mi_reps = [rep for rep in mi if rep.house]
mi_senate = [rep for rep in mi if rep.senate]

Find all Campain Staff Disbursements

Look through each Michigan rep and their staffers and find disbursements.

In [4]:
df2=pd.DataFrame()
for rep in mi_reps:
    for staffer in rep.staffers2.keys():
        staffer_name = HumanName(staffer)
        df_ = df[
            df.recipient_name.str.contains(",") &
            df.recipient_name.str.contains(staffer_name.first.upper()) &
            df.recipient_name.str.contains(staffer_name.last.upper()) &
            df.committee_name.str.contains(rep.last_name.upper())
        ]
        # If the staffer recieved any disbursements.
        if len(df_)>0:
            # Get the total and round to cents. Otherwise floating point numbers do weird things.
            total = np.round(df_.disbursement_amount.sum(), 2)
            print(f"{rep.state_abbr}-{rep.district}\t{rep.name}: {staffer_name}, {len(df_)} disbursements: ${total}")
            df2 = df2.append(
                other=df_,
                verify_integrity=True,
            )
df2.reset_index(inplace=True)
MI-1	Jack Bergman: Amelia Burns, 24 disbursements: $20437.85
MI-2	Bill Huizenga: Jon DeWitte, 20 disbursements: $63183.79
MI-2	Bill Huizenga: Palmer Rafferty, 1 disbursements: $201.84
MI-2	Bill Huizenga: Brian Patrick, 82 disbursements: $60439.51
MI-2	Bill Huizenga: Marliss McManus, 17 disbursements: $16006.86
MI-2	Bill Huizenga: Phil Rokus, 2 disbursements: $1747.13
MI-2	Bill Huizenga: Matt Kooiman, 117 disbursements: $67254.43
MI-3	Justin Amash: Poppy Nelson, 20 disbursements: $37685.17
MI-3	Justin Amash: Matt Weibel, 13 disbursements: $40748.25
MI-4	John Moolenaar: David Russell, 2 disbursements: $468.53
MI-4	John Moolenaar: Cliff Burdick, 5 disbursements: $208.73
MI-4	John Moolenaar: Chris MacArthur, 31 disbursements: $34539.73
MI-4	John Moolenaar: Ashton Bortz, 49 disbursements: $9334.05
MI-5	Dan Kildee: Mitchell Rivard, 11 disbursements: $6623.1
MI-5	Dan Kildee: Ghada Alkiek, 37 disbursements: $110091.43
MI-7	Tim Walberg: Stephen Rajzer, 57 disbursements: $98924.43
MI-8	Elissa Slotkin: Mela Louise Norman, 44 disbursements: $109312.41
MI-8	Elissa Slotkin: Megan Birleson, 4 disbursements: $2768.6
MI-8	Elissa Slotkin: Hannah Lindow, 24 disbursements: $27621.2
MI-8	Elissa Slotkin: Austin Girelli, 12 disbursements: $13544.37
MI-8	Elissa Slotkin: Francesca Caal Skonos, 14 disbursements: $6948.29
MI-9	Andy Levin: Abbas Alawieh, 9 disbursements: $12414.19
MI-9	Andy Levin: Walt Herzig, 1 disbursements: $67.96
MI-11	Haley Stevens: John Martin, 10 disbursements: $11897.34
MI-11	Haley Stevens: Blake McCarren, 6 disbursements: $12203.64
MI-11	Haley Stevens: Colleen Pobur, 3 disbursements: $2359.11
MI-12	Debbie Dingell: Kevin Dollhopf, 7 disbursements: $1150.1
MI-12	Debbie Dingell: Kelly Tebay, 1 disbursements: $407.62
MI-13	Rashida Tlaib: Ryan Anderson, 14 disbursements: $34469.04
MI-13	Rashida Tlaib: Andrew Goddeeris, 23 disbursements: $94188.11

Representative Staffer Disbursements

Count and Sum total of disbursements to representative staffers. Sorted by disbursement sum.

In [5]:
_ = df2.groupby("committee_name").agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by=[("disbursement_sum")], inplace=True)
_
Out[5]:
disbursement_count disbursement_sum
committee_name
DEBBIE DINGELL FOR CONGRESS 8 1557.72
ANDY LEVIN FOR CONGRESS 10 12482.15
BERGMANFORCONGRESS 24 20437.85
HALEY STEVENS FOR CONGRESS 19 26460.09
MOOLENAAR FOR CONGRESS 87 44551.04
JUSTIN AMASH FOR CONGRESS 33 78433.42
WALBERG FOR CONGRESS 57 98924.43
FRIENDS OF DAN KILDEE 48 116714.53
RASHIDA TLAIB FOR CONGRESS 37 128657.15
ELISSA SLOTKIN FOR CONGRESS 98 160194.87
HUIZENGA FOR CONGRESS 239 208833.56
In [6]:
ax = _["disbursement_sum"].plot(kind='bar')
# Labels
plt.xlabel("Committee Name")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no=1
title = f"Fig {fig_no}. MI Representative Staff Campaign Disbursements"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Staffer Disbursements Grouped by Committee Name.

In [7]:
_ = df2.groupby(['committee_name','recipient_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[7]:
disbursement_count disbursement_sum
committee_name recipient_name
ANDY LEVIN FOR CONGRESS ALAWIEH, ABBAS 9 12414.19
HERZIG, WALTER C. 1 67.96
BERGMANFORCONGRESS BURNS, AMELIA 24 20437.85
DEBBIE DINGELL FOR CONGRESS DOLLHOPF, KEVIN 7 1150.10
TEBAY, KELLY 1 407.62
ELISSA SLOTKIN FOR CONGRESS BIRLESON, MEGAN 4 2768.60
CAALSKONOS, FRANCESCA 14 6948.29
GIRELLI, AUSTIN 12 13544.37
LINDOW, HANNAH 24 27621.20
NORMAN, MELA LOUISE 44 109312.41
FRIENDS OF DAN KILDEE ALKIEK, GHADA 37 110091.43
RIVARD, MITCHELL 11 6623.10
HALEY STEVENS FOR CONGRESS MARTIN, JOHN 10 11897.34
MCCARREN, BLAKE 6 12203.64
POBUR, COLLEEN 3 2359.11
HUIZENGA FOR CONGRESS BROWDER MCMANUS, MARLISS 2 488.37
DEWITTE, JON 7 18653.56
DEWITTE, JON MR. 13 44530.23
KOOIMAN, MATT 106 62553.90
KOOIMAN, MATT MR. 4 1353.32
KOOIMAN-, MATT 7 3347.21
MCMANUS, MARLISS 15 15518.49
PATRICK, BRIAN 71 55176.50
PATRICK-, BRIAN 11 5263.01
RAFFERTY, PALMER 1 201.84
ROKUS, PHILIP 2 1747.13
JUSTIN AMASH FOR CONGRESS NELSON, POPPY 20 37685.17
WEIBEL, MATTHEW 13 40748.25
MOOLENAAR FOR CONGRESS BORTZ, ASHTON 3 1163.25
BORTZ, ASHTON M. MS. 6 978.00
BORTZ, ASHTON MS. 40 7192.80
BURDICK, CLIFF 5 208.73
MACARTHUR, CHRISTOPHER 31 34539.73
RUSSELL, DAVID MR. 2 468.53
RASHIDA TLAIB FOR CONGRESS ANDERSON, RYAN 14 34469.04
GODDEERIS, ANDREW 23 94188.11
WALBERG FOR CONGRESS RAJZER, STEPHEN 54 98567.78
RAJZER, STEPHEN MR 3 356.65

[Name Normalization Sidebar]

Before further analysis, normalize the recipient names.

For what ever reason, Huizenga has the most 'variety' in recipient names. Making it annoying to aggregate results.

For example:

DEWITTE, JON                 18653.56
DEWITTE, JON MR.             44530.23

"Mr." splits Jon's disbursements into two. Hanlon's razor?

In [8]:
def norm_name(recipient_name):
    # Normalize dashes added to Brian Patrick & Matt Kooiman's names.
    recipient_name = recipient_name.replace("-", "")
    # Normalize MCMANUS, MARLISS's married name.
    recipient_name = recipient_name.replace("BROWDER ", "")
    # Use HumanName to strip out titles.
    hn = HumanName(recipient_name)
    return f'{hn["last"]}, {hn["first"]}'
df2["recipient"] = df2.recipient_name.apply(norm_name)

Staffer Disbursements Grouped by Committee Name, Deux

In [9]:
_ = df2.groupby(["committee_name", "recipient"]).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[9]:
disbursement_count disbursement_sum
committee_name recipient
ANDY LEVIN FOR CONGRESS ALAWIEH, ABBAS 9 12414.19
HERZIG, WALTER 1 67.96
BERGMANFORCONGRESS BURNS, AMELIA 24 20437.85
DEBBIE DINGELL FOR CONGRESS DOLLHOPF, KEVIN 7 1150.10
TEBAY, KELLY 1 407.62
ELISSA SLOTKIN FOR CONGRESS BIRLESON, MEGAN 4 2768.60
CAALSKONOS, FRANCESCA 14 6948.29
GIRELLI, AUSTIN 12 13544.37
LINDOW, HANNAH 24 27621.20
NORMAN, MELA 44 109312.41
FRIENDS OF DAN KILDEE ALKIEK, GHADA 37 110091.43
RIVARD, MITCHELL 11 6623.10
HALEY STEVENS FOR CONGRESS MARTIN, JOHN 10 11897.34
MCCARREN, BLAKE 6 12203.64
POBUR, COLLEEN 3 2359.11
HUIZENGA FOR CONGRESS DEWITTE, JON 20 63183.79
KOOIMAN, MATT 117 67254.43
MCMANUS, MARLISS 17 16006.86
PATRICK, BRIAN 82 60439.51
RAFFERTY, PALMER 1 201.84
ROKUS, PHILIP 2 1747.13
JUSTIN AMASH FOR CONGRESS NELSON, POPPY 20 37685.17
WEIBEL, MATTHEW 13 40748.25
MOOLENAAR FOR CONGRESS BORTZ, ASHTON 49 9334.05
BURDICK, CLIFF 5 208.73
MACARTHUR, CHRISTOPHER 31 34539.73
RUSSELL, DAVID 2 468.53
RASHIDA TLAIB FOR CONGRESS ANDERSON, RYAN 14 34469.04
GODDEERIS, ANDREW 23 94188.11
WALBERG FOR CONGRESS RAJZER, STEPHEN 57 98924.43

Staffer Disbursements Sorted by Number of Disbursements.

In [10]:
_.sort_values(by=[("disbursement_count")])
Out[10]:
disbursement_count disbursement_sum
committee_name recipient
ANDY LEVIN FOR CONGRESS HERZIG, WALTER 1 67.96
DEBBIE DINGELL FOR CONGRESS TEBAY, KELLY 1 407.62
HUIZENGA FOR CONGRESS RAFFERTY, PALMER 1 201.84
MOOLENAAR FOR CONGRESS RUSSELL, DAVID 2 468.53
HUIZENGA FOR CONGRESS ROKUS, PHILIP 2 1747.13
HALEY STEVENS FOR CONGRESS POBUR, COLLEEN 3 2359.11
ELISSA SLOTKIN FOR CONGRESS BIRLESON, MEGAN 4 2768.60
MOOLENAAR FOR CONGRESS BURDICK, CLIFF 5 208.73
HALEY STEVENS FOR CONGRESS MCCARREN, BLAKE 6 12203.64
DEBBIE DINGELL FOR CONGRESS DOLLHOPF, KEVIN 7 1150.10
ANDY LEVIN FOR CONGRESS ALAWIEH, ABBAS 9 12414.19
HALEY STEVENS FOR CONGRESS MARTIN, JOHN 10 11897.34
FRIENDS OF DAN KILDEE RIVARD, MITCHELL 11 6623.10
ELISSA SLOTKIN FOR CONGRESS GIRELLI, AUSTIN 12 13544.37
JUSTIN AMASH FOR CONGRESS WEIBEL, MATTHEW 13 40748.25
ELISSA SLOTKIN FOR CONGRESS CAALSKONOS, FRANCESCA 14 6948.29
RASHIDA TLAIB FOR CONGRESS ANDERSON, RYAN 14 34469.04
HUIZENGA FOR CONGRESS MCMANUS, MARLISS 17 16006.86
DEWITTE, JON 20 63183.79
JUSTIN AMASH FOR CONGRESS NELSON, POPPY 20 37685.17
RASHIDA TLAIB FOR CONGRESS GODDEERIS, ANDREW 23 94188.11
ELISSA SLOTKIN FOR CONGRESS LINDOW, HANNAH 24 27621.20
BERGMANFORCONGRESS BURNS, AMELIA 24 20437.85
MOOLENAAR FOR CONGRESS MACARTHUR, CHRISTOPHER 31 34539.73
FRIENDS OF DAN KILDEE ALKIEK, GHADA 37 110091.43
ELISSA SLOTKIN FOR CONGRESS NORMAN, MELA 44 109312.41
MOOLENAAR FOR CONGRESS BORTZ, ASHTON 49 9334.05
WALBERG FOR CONGRESS RAJZER, STEPHEN 57 98924.43
HUIZENGA FOR CONGRESS PATRICK, BRIAN 82 60439.51
KOOIMAN, MATT 117 67254.43

Staffer Disbursements Sorted by Value of Disbursements.

In [11]:
_.sort_values(by=[("disbursement_sum")])
Out[11]:
disbursement_count disbursement_sum
committee_name recipient
ANDY LEVIN FOR CONGRESS HERZIG, WALTER 1 67.96
HUIZENGA FOR CONGRESS RAFFERTY, PALMER 1 201.84
MOOLENAAR FOR CONGRESS BURDICK, CLIFF 5 208.73
DEBBIE DINGELL FOR CONGRESS TEBAY, KELLY 1 407.62
MOOLENAAR FOR CONGRESS RUSSELL, DAVID 2 468.53
DEBBIE DINGELL FOR CONGRESS DOLLHOPF, KEVIN 7 1150.10
HUIZENGA FOR CONGRESS ROKUS, PHILIP 2 1747.13
HALEY STEVENS FOR CONGRESS POBUR, COLLEEN 3 2359.11
ELISSA SLOTKIN FOR CONGRESS BIRLESON, MEGAN 4 2768.60
FRIENDS OF DAN KILDEE RIVARD, MITCHELL 11 6623.10
ELISSA SLOTKIN FOR CONGRESS CAALSKONOS, FRANCESCA 14 6948.29
MOOLENAAR FOR CONGRESS BORTZ, ASHTON 49 9334.05
HALEY STEVENS FOR CONGRESS MARTIN, JOHN 10 11897.34
MCCARREN, BLAKE 6 12203.64
ANDY LEVIN FOR CONGRESS ALAWIEH, ABBAS 9 12414.19
ELISSA SLOTKIN FOR CONGRESS GIRELLI, AUSTIN 12 13544.37
HUIZENGA FOR CONGRESS MCMANUS, MARLISS 17 16006.86
BERGMANFORCONGRESS BURNS, AMELIA 24 20437.85
ELISSA SLOTKIN FOR CONGRESS LINDOW, HANNAH 24 27621.20
RASHIDA TLAIB FOR CONGRESS ANDERSON, RYAN 14 34469.04
MOOLENAAR FOR CONGRESS MACARTHUR, CHRISTOPHER 31 34539.73
JUSTIN AMASH FOR CONGRESS NELSON, POPPY 20 37685.17
WEIBEL, MATTHEW 13 40748.25
HUIZENGA FOR CONGRESS PATRICK, BRIAN 82 60439.51
DEWITTE, JON 20 63183.79
KOOIMAN, MATT 117 67254.43
RASHIDA TLAIB FOR CONGRESS GODDEERIS, ANDREW 23 94188.11
WALBERG FOR CONGRESS RAJZER, STEPHEN 57 98924.43
ELISSA SLOTKIN FOR CONGRESS NORMAN, MELA 44 109312.41
FRIENDS OF DAN KILDEE ALKIEK, GHADA 37 110091.43

Staffer Disbursements Grouped by Committee Name & Disbursement Description

In [12]:
_ = df2.groupby(['committee_name','disbursement_description']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[12]:
disbursement_count disbursement_sum
committee_name disbursement_description
ANDY LEVIN FOR CONGRESS EVENT SUPPLIES 1 67.96
OFFICE SUPPLY REIMBURSEMENT 1 212.00
PAYROLL 8 12202.19
BERGMANFORCONGRESS CAMPAIGN CONSULTING 1 2000.00
FIELD CONSULTING 6 10095.00
NO ITEMIZATION NECESSARY 1 120.41
POSTAGE REIMBURSEMENT 3 179.49
SEE BELOW 2 1366.79
SEE MEMO ENTRIES 5 1116.48
SEE MEMO ENTRY 4 559.68
STRATEGY CONSULTING 2 5000.00
DEBBIE DINGELL FOR CONGRESS REIMBURSEMENT 1 407.62
TRAVEL REIMBURSEMENT - OFFICIALLY CONNECTED 7 1150.10
ELISSA SLOTKIN FOR CONGRESS MILEAGE REIMBURSEMENT 6 1086.90
PAYROL 1 2410.01
PAYROLL 83 153271.39
REIMBURSEMENT 4 1749.81
REIMBURSEMENT (VENDORS OVER $200 AGGREGATE BELOW) 2 1048.71
REIMBURSEMENT (VENDORS THAT AGGREGATE OVER $200 APPEAR BELOW) 1 443.91
REIMBURSEMENT (VENDORS THAT AGGREGATE OVER $200 LISTED BELOW) 1 184.14
FRIENDS OF DAN KILDEE ADVANCE FOR PURCHASE OF FOOD FOR FUNDRAISER 1 434.00
CAR RENTAL 1 182.38
CONTRACT CONSULTING 2 3720.00
CONTRACT PROFESSIONAL SERVICES 1 706.24
EXPENSE REIMBURSEMENT 2 642.66
FOOD FOR OFFICE OPEN HOUSE 1 42.47
FUEL REIMBURSEMENT FOR CAMPAIGN APPEARANCES 1 181.30
FUNDRAISER SUPPLIES 1 45.96
FUNDRAISING CONSULTING 14 39166.00
FUNDRAISING EMPLOYEE 1 9841.76
OFFICE SUPPLY REIMBURSEMENT 1 219.44
PAYROLL 15 52892.09
PAYROLL EXPENSES 1 7381.32
REFUND FROM ACTBLUE 1 5.00
REIMBURSEMENT FOR PRINTING EXPENSE 1 81.48
SOCIAL MEDIA CONSULTING 1 786.56
SUPPLIES 1 23.97
TRAVEL EXPENSE REIMBURSEMENT 2 361.90
HALEY STEVENS FOR CONGRESS MILEAGE 1 327.70
REIMBURSEMENT - TRAVEL 1 1775.56
SALARY 16 24100.98
TRAVEL REIMBURSEMENT, MEMOS BELOW IF ITEMIZED 1 255.85
HUIZENGA FOR CONGRESS ADMINISTRATION SERVICES 5 2500.00
ADMINISTRATIVE EXPENSE 2 1000.00
CAMPAIGN BREAKFAST MEETING 1 39.47
CAMPAIGN CONSULTANT 51 30837.98
CAMPAIGN CONSULTING 3 3000.00
CAMPAIGN EVENT: MILEAGE REIMBURSEMENT 1 229.71
CAMPAIGN EXPENSES 5 20675.85
CONSULTING SERVICES 4 17354.10
DIRECT MAIL PRINTING 4 4195.00
EXPENSE REIMBURSEMENT 2 3114.20
EXPENSES 3 11132.20
FIELD CONSULTANT 1 500.00
FIELD CONSULTING 12 9055.00
FUNDRAISING CONSULTING 8 8966.32
LABOR FOR CAMPAIGN WORKER 1 750.00
MILEAGE EXPENSE 1 213.27
MILEAGE REIMBURSEMENT 66 33288.11
PERFORMANCE BONUS 1 1000.00
PHONE EXPENSE 1 85.66
REFRESHMENTS FOR CAMPAIGN EVENT 1 1100.00
REIMBURSEMENT FOR MILEAGE 2 454.09
SALARY 5 5510.60
SALARY FOR CAMPAIGN WORKER 9 4500.00
SEE BELOW 10 21454.54
STRATEGY CONSULTING 11 13750.00
TAXI & FED EX SUPPLIES REIMBUR 1 259.99
TRAVEL: MILEAGE REIMBURSEMENT 27 11867.47
JUSTIN AMASH FOR CONGRESS ADMINISTRATIVE CONSULTING 14 43749.66
ADMINISTRATIVE/STRATEGIC SUPPORT 2 3436.03
ADMINSTRATIVE/STRATEGIC SUPPORT 2 2872.06
REIMBURSEMENT FOR TONER 1 116.58
SALARY 11 27287.50
TRAVEL 1 12.50
TRAVEL EXPENSE--SEE MEMO 1 155.09
TRAVEL EXPENSE-SEE MEMOS 1 804.00
MOOLENAAR FOR CONGRESS EXPENSE REIMBURSEMENT - ITEMIZED 1 731.62
MILEAGE 39 14591.30
MILEAGE - EXPENSES ITEMIZED 2 712.75
MILEAGE REIMBURSEMENT 19 5404.05
MILEAGE, EQUIPMENT - ITEMIZED 1 526.40
MILEAGE, EXP. REIMBURSEMENT - ITEMIZED 3 525.25
MILEAGE, EXPENSES - ITEMIZED 5 354.82
SUPPLIES - ITEMIZED 1 149.60
WAGES 16 21555.25
RASHIDA TLAIB FOR CONGRESS CAMPAIGN FINANCE DIRECTOR PAY 2/12 TO 2/28 1 2550.00
FINANCE DIRECTOR PAY 1 675.00
FUNDRAISING CONSULTATION 2 16000.00
OFFICE SUPPLIES 2 164.46
REIMBURSEMENT 1 1359.35
REIMBURSEMENT - CATERING FOR DETROIT RECEPTION 1 218.00
REIMBURSEMENT - TRAVEL 1 492.40
REIMBURSEMENT FROM TRAVEL 1 1196.33
REIMBURSEMENT OF TRAVEL EXPENSES 1 264.11
RESEARCH 1 5125.00
SALARY 25 100612.50
WALBERG FOR CONGRESS ADMINISTRATIVE/SALARY/OVERHEAD: SALARY 8 26055.49
MILEAGE 13 7076.30
OTHER: REIMBURSEMENT - FOOD/SUPPLIES 1 573.65
OTHER: REIMBURSEMENT - INSURANCE 1 74.21
OTHER: REIMBURSEMENT - SUPPLIES 6 1371.93
OTHER: REIMBURSEMENT - SUPPLIES/FOOD 3 960.58
OTHER: REIMBURSEMENT - TRAVEL 1 238.71
PRE-IMBURSMENT RENTAL 1 82.00
REIMBURSEMENT - SUPPLIES, INSURANCE 1 304.40
REIMBURSEMENT - SUPPLIES/POSTAGE/INSURANCE 1 214.20
SALARY 11 53639.06
SALARY - BONUS 1 5000.00
TRAVEL: MILEAGE 9 3333.90

Payroll vs Non-Payroll Staff Disbursements

As shown in Fig 1., Huizenga's staff disbursements is inline (but still higher) with disbursements taken by other Michigan representative staffers. However all other campaigns have considerable spending for salary/payroll.

For the purposes of this analysis "Salary" & "Payroll" are synonymous.

In [13]:
# Determine if a disbursement 
def ispayroll(disbursement_description):
    if "SALARY" in disbursement_description:
        return "Payroll"
    # Edgecase for a typo.
    if "PAYROL" in disbursement_description:
        return "Payroll"
    return "Non-Payroll"
# Force disbursement_description to a string. 
df2["disbursement_description"] = df2.disbursement_description.apply(str)
# Add payroll column.
df2["payroll"] = df2.disbursement_description.apply(ispayroll)

Payroll vs Non Payroll Staff Disbursements, Grouped by Committee Name

In [14]:
_ = df2.groupby(['committee_name', "payroll"]).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[14]:
disbursement_count disbursement_sum
committee_name payroll
ANDY LEVIN FOR CONGRESS Non-Payroll 2 279.96
Payroll 8 12202.19
BERGMANFORCONGRESS Non-Payroll 24 20437.85
DEBBIE DINGELL FOR CONGRESS Non-Payroll 8 1557.72
ELISSA SLOTKIN FOR CONGRESS Non-Payroll 14 4513.47
Payroll 84 155681.40
FRIENDS OF DAN KILDEE Non-Payroll 32 56441.12
Payroll 16 60273.41
HALEY STEVENS FOR CONGRESS Non-Payroll 3 2359.11
Payroll 16 24100.98
HUIZENGA FOR CONGRESS Non-Payroll 225 198822.96
Payroll 14 10010.60
JUSTIN AMASH FOR CONGRESS Non-Payroll 22 51145.92
Payroll 11 27287.50
MOOLENAAR FOR CONGRESS Non-Payroll 87 44551.04
RASHIDA TLAIB FOR CONGRESS Non-Payroll 12 28044.65
Payroll 25 100612.50
WALBERG FOR CONGRESS Non-Payroll 37 14229.88
Payroll 20 84694.55
In [15]:
ax = _["disbursement_sum"].unstack().plot(kind='bar', stacked=True)
# Labels
plt.xlabel("Committee Name")
plt.ylabel("Total Amount of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
plt.legend(bbox_to_anchor=(1, 1))
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Payroll vs Non-Payroll Campaign Staff Disbursements"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Committee Staff Disbursements Grouped by Payroll vs Non-Payroll

In [16]:
_ = df2.groupby(["payroll", 'committee_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by=["payroll", "disbursement_sum"], inplace=True)
_
Out[16]:
disbursement_count disbursement_sum
payroll committee_name
Non-Payroll ANDY LEVIN FOR CONGRESS 2 279.96
DEBBIE DINGELL FOR CONGRESS 8 1557.72
HALEY STEVENS FOR CONGRESS 3 2359.11
ELISSA SLOTKIN FOR CONGRESS 14 4513.47
WALBERG FOR CONGRESS 37 14229.88
BERGMANFORCONGRESS 24 20437.85
RASHIDA TLAIB FOR CONGRESS 12 28044.65
MOOLENAAR FOR CONGRESS 87 44551.04
JUSTIN AMASH FOR CONGRESS 22 51145.92
FRIENDS OF DAN KILDEE 32 56441.12
HUIZENGA FOR CONGRESS 225 198822.96
Payroll HUIZENGA FOR CONGRESS 14 10010.60
ANDY LEVIN FOR CONGRESS 8 12202.19
HALEY STEVENS FOR CONGRESS 16 24100.98
JUSTIN AMASH FOR CONGRESS 11 27287.50
FRIENDS OF DAN KILDEE 16 60273.41
WALBERG FOR CONGRESS 20 84694.55
RASHIDA TLAIB FOR CONGRESS 25 100612.50
ELISSA SLOTKIN FOR CONGRESS 84 155681.40
In [17]:
ax = _["disbursement_sum"].unstack().plot(kind='bar', stacked=True)
# Labels
plt.xlabel("")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Campaign Staff Disbursements, Payroll vs Non-Payroll"
plt.title(title)
plt.legend(title="Committee Name", loc='bottom left', bbox_to_anchor=(1.0, 1))
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Non-Payroll Disbursements

Looking into just disbursements made to legislative staff that were not for payroll purposes.

Review No. 19-2187:

II: REP. HUIZENGA’S CAMPAIGN COMMITTEE MAY HAVE ACCEPTED CONTRIBUTIONS FROM CONGRESSIONAL STAFFERS

A. Applicable Law, Rules, and Standards of Conduct

  1. House Ethics Manual

    “The definition of the term contribution in the FECA is quite detailed . . . [U]nder FEC regulations, most outlays that an individual makes on behalf of a campaign are deemed to be a contribution to that campaign from that individual. This is so even if it is intended that the campaign will reimburse the individual promptly. The major exception to this rule is for outlays that an individual makes to cover expenses that he or she incurs in traveling on behalf of a campaign.” 10 Assuming certain travel outlays are reimbursed within specified time periods, they will not be considered “contributions.”

Non-Payroll Disbursements by Committee.

Sorted by disbursement total.

In [18]:
non_payroll_df = df2[df2.payroll == "Non-Payroll"]
_ = non_payroll_df.groupby(['committee_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by="disbursement_sum", inplace=True)
_
Out[18]:
disbursement_count disbursement_sum
committee_name
ANDY LEVIN FOR CONGRESS 2 279.96
DEBBIE DINGELL FOR CONGRESS 8 1557.72
HALEY STEVENS FOR CONGRESS 3 2359.11
ELISSA SLOTKIN FOR CONGRESS 14 4513.47
WALBERG FOR CONGRESS 37 14229.88
BERGMANFORCONGRESS 24 20437.85
RASHIDA TLAIB FOR CONGRESS 12 28044.65
MOOLENAAR FOR CONGRESS 87 44551.04
JUSTIN AMASH FOR CONGRESS 22 51145.92
FRIENDS OF DAN KILDEE 32 56441.12
HUIZENGA FOR CONGRESS 225 198822.96
In [19]:
ax = _["disbursement_sum"].plot(kind="bar")
# Labels
plt.xlabel("Committee Name")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Non-Payroll Staff Disbursements"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Non-Payroll Disbursements by Recipient

Sorted by total disbursement sum.

In [20]:
_ = non_payroll_df.groupby(['recipient', 'committee_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by="disbursement_sum", inplace=True)
_
Out[20]:
disbursement_count disbursement_sum
recipient committee_name
HERZIG, WALTER ANDY LEVIN FOR CONGRESS 1 67.96
RAFFERTY, PALMER HUIZENGA FOR CONGRESS 1 201.84
BURDICK, CLIFF MOOLENAAR FOR CONGRESS 5 208.73
ALAWIEH, ABBAS ANDY LEVIN FOR CONGRESS 1 212.00
CAALSKONOS, FRANCESCA ELISSA SLOTKIN FOR CONGRESS 3 330.45
GIRELLI, AUSTIN ELISSA SLOTKIN FOR CONGRESS 2 370.00
TEBAY, KELLY DEBBIE DINGELL FOR CONGRESS 1 407.62
RUSSELL, DAVID MOOLENAAR FOR CONGRESS 2 468.53
DOLLHOPF, KEVIN DEBBIE DINGELL FOR CONGRESS 7 1150.10
ROKUS, PHILIP HUIZENGA FOR CONGRESS 2 1747.13
NORMAN, MELA ELISSA SLOTKIN FOR CONGRESS 4 1836.35
LINDOW, HANNAH ELISSA SLOTKIN FOR CONGRESS 5 1976.67
POBUR, COLLEEN HALEY STEVENS FOR CONGRESS 3 2359.11
GODDEERIS, ANDREW RASHIDA TLAIB FOR CONGRESS 4 5781.86
RIVARD, MITCHELL FRIENDS OF DAN KILDEE 11 6623.10
BORTZ, ASHTON MOOLENAAR FOR CONGRESS 49 9334.05
NELSON, POPPY JUSTIN AMASH FOR CONGRESS 9 10397.67
RAJZER, STEPHEN WALBERG FOR CONGRESS 37 14229.88
MCMANUS, MARLISS HUIZENGA FOR CONGRESS 17 16006.86
BURNS, AMELIA BERGMANFORCONGRESS 24 20437.85
ANDERSON, RYAN RASHIDA TLAIB FOR CONGRESS 8 22262.79
MACARTHUR, CHRISTOPHER MOOLENAAR FOR CONGRESS 31 34539.73
WEIBEL, MATTHEW JUSTIN AMASH FOR CONGRESS 13 40748.25
ALKIEK, GHADA FRIENDS OF DAN KILDEE 21 49818.02
PATRICK, BRIAN HUIZENGA FOR CONGRESS 78 56178.91
KOOIMAN, MATT HUIZENGA FOR CONGRESS 107 61504.43
DEWITTE, JON HUIZENGA FOR CONGRESS 20 63183.79
In [21]:
ax = _["disbursement_sum"].unstack().plot(kind="bar", stacked=True)
# Labels
plt.xlabel("Disbursement Recipient")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
plt.legend(title="Committee Name", bbox_to_anchor=(1.0, 1))
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Non-Payroll Staff Disbursements, by Recipient"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Non-Payroll Staff Disbursement, Grouped By Committee Name & Disbursement Purpose Category

In [22]:
_ = non_payroll_df.groupby(['committee_name', 'disbursement_purpose_category']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[22]:
disbursement_count disbursement_sum
committee_name disbursement_purpose_category
ANDY LEVIN FOR CONGRESS OTHER 2 279.96
BERGMANFORCONGRESS ADMINISTRATIVE 3 179.49
OTHER 21 20258.36
DEBBIE DINGELL FOR CONGRESS OTHER 1 407.62
TRAVEL 7 1150.10
ELISSA SLOTKIN FOR CONGRESS OTHER 14 4513.47
FRIENDS OF DAN KILDEE ADMINISTRATIVE 1 182.38
ADVERTISING 2 868.04
MATERIALS 5 1047.03
OTHER 23 54338.67
REFUNDS 1 5.00
HALEY STEVENS FOR CONGRESS OTHER 2 2103.26
TRAVEL 1 255.85
HUIZENGA FOR CONGRESS FUNDRAISING 4 4195.00
MATERIALS 14 36221.18
OTHER 207 158406.78
JUSTIN AMASH FOR CONGRESS MATERIALS 2 959.09
OTHER 20 50186.83
MOOLENAAR FOR CONGRESS MATERIALS 8 1799.19
OTHER 79 42751.85
RASHIDA TLAIB FOR CONGRESS ADMINISTRATIVE 2 164.46
FUNDRAISING 1 218.00
MATERIALS 1 264.11
OTHER 8 27398.08
WALBERG FOR CONGRESS ADMINISTRATIVE 2 296.20
OTHER 35 13933.68
In [23]:
ax = _["disbursement_sum"].unstack().plot(kind='bar', stacked=True)
# Labels
plt.xlabel("Committee Name")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Non-Payroll Staff Disbursement, Grouped By Committee Name & Disbursement Category"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Non-Payroll Material Staff Disbursement, Grouped By Committee Name & Disbursement Description

“The definition of the term contribution in the FECA is quite detailed . . . [U]nder FEC regulations, most outlays that an individual makes on behalf of a campaign are deemed to be a contribution to that campaign from that individual. This is so even if it is intended that the campaign will reimburse the individual promptly. The major exception to this rule is for outlays that an individual makes to cover expenses that he or she incurs in traveling on behalf of a campaign.” Assuming certain travel outlays are reimbursed within specified time periods, they will not be considered “contributions.”

In [24]:
material_df = non_payroll_df[non_payroll_df.disbursement_purpose_category=="MATERIALS"]
_ = material_df.groupby(['committee_name','disbursement_description']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[24]:
disbursement_count disbursement_sum
committee_name disbursement_description
FRIENDS OF DAN KILDEE EXPENSE REIMBURSEMENT 2 642.66
FOOD FOR OFFICE OPEN HOUSE 1 42.47
TRAVEL EXPENSE REIMBURSEMENT 2 361.90
HUIZENGA FOR CONGRESS ADMINISTRATIVE EXPENSE 2 1000.00
CAMPAIGN EXPENSES 5 20675.85
EXPENSE REIMBURSEMENT 2 3114.20
EXPENSES 3 11132.20
MILEAGE EXPENSE 1 213.27
PHONE EXPENSE 1 85.66
JUSTIN AMASH FOR CONGRESS TRAVEL EXPENSE--SEE MEMO 1 155.09
TRAVEL EXPENSE-SEE MEMOS 1 804.00
MOOLENAAR FOR CONGRESS EXPENSE REIMBURSEMENT - ITEMIZED 1 731.62
MILEAGE - EXPENSES ITEMIZED 2 712.75
MILEAGE, EXPENSES - ITEMIZED 5 354.82
RASHIDA TLAIB FOR CONGRESS REIMBURSEMENT OF TRAVEL EXPENSES 1 264.11
In [25]:
ax = _["disbursement_sum"].unstack().plot(kind='bar', stacked=True)
# Labels
plt.xlabel("Committee Name")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Non-Payroll Staff Material Disbursement"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Non-Payroll Material Staff Disbursement, Grouped By Committee Name, Recipient, & Disbursement Description

In [26]:
_ = material_df.groupby(['committee_name','recipient', 'disbursement_description']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[26]:
disbursement_count disbursement_sum
committee_name recipient disbursement_description
FRIENDS OF DAN KILDEE ALKIEK, GHADA FOOD FOR OFFICE OPEN HOUSE 1 42.47
RIVARD, MITCHELL EXPENSE REIMBURSEMENT 2 642.66
TRAVEL EXPENSE REIMBURSEMENT 2 361.90
HUIZENGA FOR CONGRESS DEWITTE, JON CAMPAIGN EXPENSES 5 20675.85
EXPENSES 3 11132.20
KOOIMAN, MATT ADMINISTRATIVE EXPENSE 2 1000.00
MILEAGE EXPENSE 1 213.27
PHONE EXPENSE 1 85.66
MCMANUS, MARLISS EXPENSE REIMBURSEMENT 2 3114.20
JUSTIN AMASH FOR CONGRESS NELSON, POPPY TRAVEL EXPENSE--SEE MEMO 1 155.09
WEIBEL, MATTHEW TRAVEL EXPENSE-SEE MEMOS 1 804.00
MOOLENAAR FOR CONGRESS BORTZ, ASHTON MILEAGE - EXPENSES ITEMIZED 2 712.75
BURDICK, CLIFF MILEAGE, EXPENSES - ITEMIZED 4 178.71
MACARTHUR, CHRISTOPHER EXPENSE REIMBURSEMENT - ITEMIZED 1 731.62
MILEAGE, EXPENSES - ITEMIZED 1 176.11
RASHIDA TLAIB FOR CONGRESS ANDERSON, RYAN REIMBURSEMENT OF TRAVEL EXPENSES 1 264.11

Misc. Disbursement Analysis

Mileage

What campaign staff gets reimbursed most for driving.

In [27]:
df.disbursement_description = df.disbursement_description.apply(str)
mileage_df = df2[
    df2.disbursement_description.str.contains("MILE")
]

Staff mileage disbursement, Grouped by Committee Name

In [28]:
_ = mileage_df.groupby(['committee_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by="disbursement_sum", inplace=True)
_
Out[28]:
disbursement_count disbursement_sum
committee_name
HALEY STEVENS FOR CONGRESS 1 327.70
ELISSA SLOTKIN FOR CONGRESS 6 1086.90
WALBERG FOR CONGRESS 22 10410.20
MOOLENAAR FOR CONGRESS 69 22114.57
HUIZENGA FOR CONGRESS 97 46052.65
In [29]:
ax = _["disbursement_sum"].plot(kind='bar', stacked=True)
# Labels
plt.xlabel("Committee Name")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Staff Mileage Disbursement"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Staff mileage disbursement, Grouped by Committee Name with Full Disbursement Description

In [30]:
_ = mileage_df.groupby(['committee_name','disbursement_description']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[30]:
disbursement_count disbursement_sum
committee_name disbursement_description
ELISSA SLOTKIN FOR CONGRESS MILEAGE REIMBURSEMENT 6 1086.90
HALEY STEVENS FOR CONGRESS MILEAGE 1 327.70
HUIZENGA FOR CONGRESS CAMPAIGN EVENT: MILEAGE REIMBURSEMENT 1 229.71
MILEAGE EXPENSE 1 213.27
MILEAGE REIMBURSEMENT 66 33288.11
REIMBURSEMENT FOR MILEAGE 2 454.09
TRAVEL: MILEAGE REIMBURSEMENT 27 11867.47
MOOLENAAR FOR CONGRESS MILEAGE 39 14591.30
MILEAGE - EXPENSES ITEMIZED 2 712.75
MILEAGE REIMBURSEMENT 19 5404.05
MILEAGE, EQUIPMENT - ITEMIZED 1 526.40
MILEAGE, EXP. REIMBURSEMENT - ITEMIZED 3 525.25
MILEAGE, EXPENSES - ITEMIZED 5 354.82
WALBERG FOR CONGRESS MILEAGE 13 7076.30
TRAVEL: MILEAGE 9 3333.90

Staff mileage disbursement, Grouped by Recipient

Sorted by total disbursement sum.

In [31]:
_ = mileage_df.groupby(['recipient', 'committee_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by="disbursement_sum", inplace=True)
_
Out[31]:
disbursement_count disbursement_sum
recipient committee_name
NORMAN, MELA ELISSA SLOTKIN FOR CONGRESS 1 42.44
CAALSKONOS, FRANCESCA ELISSA SLOTKIN FOR CONGRESS 1 97.60
RAFFERTY, PALMER HUIZENGA FOR CONGRESS 1 201.84
BURDICK, CLIFF MOOLENAAR FOR CONGRESS 5 208.73
POBUR, COLLEEN HALEY STEVENS FOR CONGRESS 1 327.70
GIRELLI, AUSTIN ELISSA SLOTKIN FOR CONGRESS 2 370.00
DEWITTE, JON HUIZENGA FOR CONGRESS 1 374.08
RUSSELL, DAVID MOOLENAAR FOR CONGRESS 2 468.53
LINDOW, HANNAH ELISSA SLOTKIN FOR CONGRESS 2 576.86
ROKUS, PHILIP HUIZENGA FOR CONGRESS 2 1747.13
MCMANUS, MARLISS HUIZENGA FOR CONGRESS 13 8195.85
PATRICK, BRIAN HUIZENGA FOR CONGRESS 17 8874.61
BORTZ, ASHTON MOOLENAAR FOR CONGRESS 49 9334.05
RAJZER, STEPHEN WALBERG FOR CONGRESS 22 10410.20
MACARTHUR, CHRISTOPHER MOOLENAAR FOR CONGRESS 13 12103.26
KOOIMAN, MATT HUIZENGA FOR CONGRESS 63 26659.14
In [32]:
ax = _["disbursement_sum"].unstack().plot(kind='bar', stacked=True)
# Labels
plt.xlabel("Recipient")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Staff Mileage Disbursement, By Staffer"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Consulting Work

What campaign staff gets reimbursed most for "Consulting" work.

In [33]:
df.disbursement_description = df.disbursement_description.apply(str)
consulting_df = df2[
    df2.disbursement_description.str.contains("CONSULT")
]

Staff consulting disbursement, Grouped by Committee Name

In [34]:
_ = consulting_df.groupby(['committee_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by="disbursement_sum", inplace=True)
_
Out[34]:
disbursement_count disbursement_sum
committee_name
RASHIDA TLAIB FOR CONGRESS 2 16000.00
BERGMANFORCONGRESS 9 17095.00
FRIENDS OF DAN KILDEE 17 43672.56
JUSTIN AMASH FOR CONGRESS 14 43749.66
HUIZENGA FOR CONGRESS 90 83463.40
In [35]:
ax = _["disbursement_sum"].plot(kind='bar', stacked=True)
# Labels
plt.xlabel("Committee Name")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Staff Consulting Disbursement"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Staff consulting disbursement, Grouped by Committee Name with Full Disbursement Description

In [36]:
_ = consulting_df.groupby(['committee_name','disbursement_description']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[36]:
disbursement_count disbursement_sum
committee_name disbursement_description
BERGMANFORCONGRESS CAMPAIGN CONSULTING 1 2000.00
FIELD CONSULTING 6 10095.00
STRATEGY CONSULTING 2 5000.00
FRIENDS OF DAN KILDEE CONTRACT CONSULTING 2 3720.00
FUNDRAISING CONSULTING 14 39166.00
SOCIAL MEDIA CONSULTING 1 786.56
HUIZENGA FOR CONGRESS CAMPAIGN CONSULTANT 51 30837.98
CAMPAIGN CONSULTING 3 3000.00
CONSULTING SERVICES 4 17354.10
FIELD CONSULTANT 1 500.00
FIELD CONSULTING 12 9055.00
FUNDRAISING CONSULTING 8 8966.32
STRATEGY CONSULTING 11 13750.00
JUSTIN AMASH FOR CONGRESS ADMINISTRATIVE CONSULTING 14 43749.66
RASHIDA TLAIB FOR CONGRESS FUNDRAISING CONSULTATION 2 16000.00

Staff consulting disbursement, Grouped by Recipient

Sorted by total disbursement sum.

In [37]:
_ = mileage_df.groupby(['recipient', 'committee_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by="disbursement_sum", inplace=True)
_
Out[37]:
disbursement_count disbursement_sum
recipient committee_name
NORMAN, MELA ELISSA SLOTKIN FOR CONGRESS 1 42.44
CAALSKONOS, FRANCESCA ELISSA SLOTKIN FOR CONGRESS 1 97.60
RAFFERTY, PALMER HUIZENGA FOR CONGRESS 1 201.84
BURDICK, CLIFF MOOLENAAR FOR CONGRESS 5 208.73
POBUR, COLLEEN HALEY STEVENS FOR CONGRESS 1 327.70
GIRELLI, AUSTIN ELISSA SLOTKIN FOR CONGRESS 2 370.00
DEWITTE, JON HUIZENGA FOR CONGRESS 1 374.08
RUSSELL, DAVID MOOLENAAR FOR CONGRESS 2 468.53
LINDOW, HANNAH ELISSA SLOTKIN FOR CONGRESS 2 576.86
ROKUS, PHILIP HUIZENGA FOR CONGRESS 2 1747.13
MCMANUS, MARLISS HUIZENGA FOR CONGRESS 13 8195.85
PATRICK, BRIAN HUIZENGA FOR CONGRESS 17 8874.61
BORTZ, ASHTON MOOLENAAR FOR CONGRESS 49 9334.05
RAJZER, STEPHEN WALBERG FOR CONGRESS 22 10410.20
MACARTHUR, CHRISTOPHER MOOLENAAR FOR CONGRESS 13 12103.26
KOOIMAN, MATT HUIZENGA FOR CONGRESS 63 26659.14
In [38]:
ax = _["disbursement_sum"].unstack().plot(kind='bar', stacked=True)
# Labels
plt.xlabel("Recipient")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Staff Consulting Disbursements, Grouped by Recipient"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

"Other", Non-Payroll.

What campaign staff gets reimbursed most for "Other" & what disbursement purposes does each compaign count as 'Other'.

In [39]:
df.disbursement_description = df.disbursement_description.apply(str)
non_payroll_other_df = non_payroll_df[
    non_payroll_df.disbursement_purpose_category == "OTHER"
]

Non-Payroll Staff "OTHER" disbursements, Grouped by Committee Name

Sorted by total disbursement sum.

In [40]:
_ = non_payroll_other_df.groupby(['committee_name']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_.sort_values(by="disbursement_sum", inplace=True)
_
Out[40]:
disbursement_count disbursement_sum
committee_name
ANDY LEVIN FOR CONGRESS 2 279.96
DEBBIE DINGELL FOR CONGRESS 1 407.62
HALEY STEVENS FOR CONGRESS 2 2103.26
ELISSA SLOTKIN FOR CONGRESS 14 4513.47
WALBERG FOR CONGRESS 35 13933.68
BERGMANFORCONGRESS 21 20258.36
RASHIDA TLAIB FOR CONGRESS 8 27398.08
MOOLENAAR FOR CONGRESS 79 42751.85
JUSTIN AMASH FOR CONGRESS 20 50186.83
FRIENDS OF DAN KILDEE 23 54338.67
HUIZENGA FOR CONGRESS 207 158406.78
In [41]:
ax = _["disbursement_sum"].plot(kind='bar', stacked=True)
# Labels
plt.xlabel("Committee Name")
plt.ylabel("Total Value of Disbursements")
ax.yaxis.set_major_formatter(dollar_tick)
# Title & Save
fig_no+=1
title = f"Fig {fig_no}. Non-Payroll 'Other' Disbursements"
plt.title(title)
plt.savefig(f"{title}.png", transparent=False, bbox_inches='tight')

Staff "other" disbursements, Grouped by Committee Name with Full Disbursement Description

In [42]:
_ = non_payroll_other_df.groupby(['committee_name','disbursement_description']).agg({"disbursement_amount": ["count", "sum"]})
_.columns = ["_".join(x) for x in _.columns.ravel()]
_.columns=[c.replace("_amount", "") for c in _.columns]
_
Out[42]:
disbursement_count disbursement_sum
committee_name disbursement_description
ANDY LEVIN FOR CONGRESS EVENT SUPPLIES 1 67.96
OFFICE SUPPLY REIMBURSEMENT 1 212.00
BERGMANFORCONGRESS CAMPAIGN CONSULTING 1 2000.00
FIELD CONSULTING 6 10095.00
NO ITEMIZATION NECESSARY 1 120.41
SEE BELOW 2 1366.79
SEE MEMO ENTRIES 5 1116.48
SEE MEMO ENTRY 4 559.68
STRATEGY CONSULTING 2 5000.00
DEBBIE DINGELL FOR CONGRESS REIMBURSEMENT 1 407.62
ELISSA SLOTKIN FOR CONGRESS MILEAGE REIMBURSEMENT 6 1086.90
REIMBURSEMENT 4 1749.81
REIMBURSEMENT (VENDORS OVER $200 AGGREGATE BELOW) 2 1048.71
REIMBURSEMENT (VENDORS THAT AGGREGATE OVER $200 APPEAR BELOW) 1 443.91
REIMBURSEMENT (VENDORS THAT AGGREGATE OVER $200 LISTED BELOW) 1 184.14
FRIENDS OF DAN KILDEE ADVANCE FOR PURCHASE OF FOOD FOR FUNDRAISER 1 434.00
CONTRACT CONSULTING 2 3720.00
CONTRACT PROFESSIONAL SERVICES 1 706.24
FUEL REIMBURSEMENT FOR CAMPAIGN APPEARANCES 1 181.30
FUNDRAISER SUPPLIES 1 45.96
FUNDRAISING CONSULTING 14 39166.00
FUNDRAISING EMPLOYEE 1 9841.76
OFFICE SUPPLY REIMBURSEMENT 1 219.44
SUPPLIES 1 23.97
HALEY STEVENS FOR CONGRESS MILEAGE 1 327.70
REIMBURSEMENT - TRAVEL 1 1775.56
HUIZENGA FOR CONGRESS ADMINISTRATION SERVICES 5 2500.00
CAMPAIGN BREAKFAST MEETING 1 39.47
CAMPAIGN CONSULTANT 51 30837.98
CAMPAIGN CONSULTING 3 3000.00
CAMPAIGN EVENT: MILEAGE REIMBURSEMENT 1 229.71
CONSULTING SERVICES 4 17354.10
FIELD CONSULTANT 1 500.00
FIELD CONSULTING 12 9055.00
FUNDRAISING CONSULTING 8 8966.32
LABOR FOR CAMPAIGN WORKER 1 750.00
MILEAGE REIMBURSEMENT 66 33288.11
PERFORMANCE BONUS 1 1000.00
REFRESHMENTS FOR CAMPAIGN EVENT 1 1100.00
REIMBURSEMENT FOR MILEAGE 2 454.09
SEE BELOW 10 21454.54
STRATEGY CONSULTING 11 13750.00
TAXI & FED EX SUPPLIES REIMBUR 1 259.99
TRAVEL: MILEAGE REIMBURSEMENT 27 11867.47
nan 1 2000.00
JUSTIN AMASH FOR CONGRESS ADMINISTRATIVE CONSULTING 14 43749.66
ADMINISTRATIVE/STRATEGIC SUPPORT 2 3436.03
ADMINSTRATIVE/STRATEGIC SUPPORT 2 2872.06
REIMBURSEMENT FOR TONER 1 116.58
TRAVEL 1 12.50
MOOLENAAR FOR CONGRESS MILEAGE 39 14591.30
MILEAGE REIMBURSEMENT 19 5404.05
MILEAGE, EQUIPMENT - ITEMIZED 1 526.40
MILEAGE, EXP. REIMBURSEMENT - ITEMIZED 3 525.25
SUPPLIES - ITEMIZED 1 149.60
WAGES 16 21555.25
RASHIDA TLAIB FOR CONGRESS CAMPAIGN FINANCE DIRECTOR PAY 2/12 TO 2/28 1 2550.00
FINANCE DIRECTOR PAY 1 675.00
FUNDRAISING CONSULTATION 2 16000.00
REIMBURSEMENT 1 1359.35
REIMBURSEMENT - TRAVEL 1 492.40
REIMBURSEMENT FROM TRAVEL 1 1196.33
RESEARCH 1 5125.00
WALBERG FOR CONGRESS MILEAGE 13 7076.30
OTHER: REIMBURSEMENT - FOOD/SUPPLIES 1 573.65
OTHER: REIMBURSEMENT - INSURANCE 1 74.21
OTHER: REIMBURSEMENT - SUPPLIES 6 1371.93
OTHER: REIMBURSEMENT - SUPPLIES/FOOD 3 960.58
OTHER: REIMBURSEMENT - TRAVEL 1 238.71
REIMBURSEMENT - SUPPLIES, INSURANCE 1 304.40
TRAVEL: MILEAGE 9 3333.90